﻿using System;
using System.Collections.Generic;
using System.Text;
using com.byt.webcore;
using System.Data;
using com.byt.suce.db.mapper;
using com.byt.suce.db.factory;
using MYLSOFT.JsonSimple;
using com.byt.webcore.utils;
using System.Reflection;
using System.IO;
using suce.upload;
using SUCE.SERVICE;

namespace com.byt.gestor.service
{
    public class Transmitir
    {
        private StringBuilder _sucesos = new StringBuilder();
        public StringBuilder Sucesos {
            get { return _sucesos; }
            set { _sucesos = value; } 
        }

        public void ReiniciarSucesos()
        {
            _sucesos = new StringBuilder();
        }

        internal Transmitir()
        {

            Helper.setPathUpload();

            Dictionary<string, string> errores = new Dictionary<string, string>();
            string codigoSolicitud = null;

            Connection gsuce = Helper.getConnection("suce"); //conexion sql
            Connection vuce = Helper.getConnection("integrador");//conexion oracle
            JSONObject jo = null;
            string error = null;
            int? idqultimo = null;
            string mensaje="";
            string idItem = "";

            PkgGestorq.GetPendienteParam param = PkgGestorqFactory.create().newGetPendienteParam();
            // Incluir trazabilidad
            PkgGestorqFactory.create().pushTraza(gsuce, (JSONObject)null); //trazabilidad

            int maxBucles = 0;

            while (true)
            {
                maxBucles++;
                if (maxBucles > 100)
                    break;

                try
                {
                    gsuce.BeginTransaction(IsolationLevel.ReadCommitted);
                    vuce.BeginTransaction(IsolationLevel.ReadCommitted);

                    param.Idqultimo = idqultimo;

                    PkgGestorqFactory.create().getPendiente(gsuce, param);


                    jo = Utils.getJSONObject(param.CurOut);
                    if (jo.Count == 0)
                        break;

                    idqultimo = (int?)jo["idq"];
                    codigoSolicitud = jo["idsolicitud"].ToString() + "-" + jo["idversion"].ToString();

                    /*
                     * correr el stored  VUC_N2 se envia el @iditem como NULL,
                     * sin embargo en la linea que sigue se hace referencia a este campo 
                     * como si tuviera algun valor
                     */
                    idItem = jo["iditem"] == null ? "" : jo["iditem"].ToString();

                    if (!errores.ContainsKey(codigoSolicitud))
                    {
                        DGSBase dgs = DGSFactory.Create((string)jo["codiformato"]);
                        if (dgs != null)
                        {
                            mensaje = (string)jo["tipomensaje"];
                            dgs.Procesar(mensaje, jo, gsuce, vuce);// se procesa segun la N ***CESAR BOCANEGRA***
                        }
                    }

                    gsuce.Commit();
                    vuce.Commit();

                    _sucesos.AppendFormat("Solicitud:{0} - Mensaje:{1} - Item:{2}", codigoSolicitud, mensaje, idItem);
                    error = null;   
                }
                catch (Exception ex)
                {
                    if (gsuce != null)
                        gsuce.Rollback();
                    if (vuce != null)
                        vuce.Rollback();
                    error = ex.ToString();
                    _sucesos.AppendFormat("Error:{0}", error);

                    errores.Add(codigoSolicitud, codigoSolicitud);

                    Program.Warning(string.Format("Error al transmitir el mensaje \"{0}\" de [idsolicitud-idversion]=[{1}] (idq={2}, iditem={3}, detalle={4})", mensaje, codigoSolicitud, idqultimo, idItem,error));
                }
                finally
                {
                    PkgGestorq.SetEstadoParam es = PkgGestorqFactory.create().newSetEstadoParam(jo);
                    es.Error = error;
                    PkgGestorqFactory.create().setEstado(gsuce, es);

                }
            }

            gsuce.Close();
            vuce.Close();

        }

    }
}
